package org.atlantis.grosbeak.cable;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 储存Web元素的容器。用户如果要获取HttpServletRequest对象，那么就可以
 * WebMetaStore.getSelf().getRequest();同理获取HttpSession对象，就是
 * WebMetaStore.getSelf().getSession();即可。 WebMetaStore与本地线程相绑定，是线程安全的。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">SeeNoEvil</a>
 * 
 */
public final class WebMetaStore {

	private static final ThreadLocal<WebMetaStore> wmsTL = new ThreadLocal<WebMetaStore>();

	private ServletContext sc;
	private HttpServletRequest request;
	private HttpServletResponse response;

	/**
	 * 获取当前的HttpServletRequest对象。
	 * 
	 * @return 当前的HttpServletRequest对象。
	 */
	public HttpServletRequest getRequest() {
		return request;
	}

	/**
	 * 获取当前的HttpServletResponse对象。
	 * 
	 * @return 当前的HttpServletResponse对象。
	 */
	public HttpServletResponse getResponse() {
		return response;
	}

	/**
	 * 获取当前的ServletContext对象。
	 * 
	 * @return 当前的ServletContext对象。
	 */
	public ServletContext getApplication() {
		return sc;
	}

	/**
	 * 获取当前的HttpSession对象。
	 * 
	 * @return 当前的HttpSession对象。
	 */
	public HttpSession getSession() {
		return request.getSession();
	}

	/**
	 * 获取对应当前线程的WebMetaStore对象。
	 * 
	 * @return 当前线程中的WebMetaStore对象。
	 */
	public static WebMetaStore getSelf() {
		return wmsTL.get();
	}

	static void removeSelf() {
		wmsTL.remove();
	}

	static void setSelf(ServletContext sc, HttpServletRequest request,
			HttpServletResponse response) {
		WebMetaStore wms = new WebMetaStore();
		wms.sc = sc;
		wms.request = request;
		wms.response = response;
		wmsTL.set(wms);
	}
}
